<?php

require_once __DIR__ . '/../vendor/autoload.php';

try {
    (new Dotenv\Dotenv(__DIR__ . '/../'))->load();
} catch (Dotenv\Exception\InvalidPathException $e) {
    //
}

/*
|--------------------------------------------------------------------------
| Create The Application
|--------------------------------------------------------------------------
|
| Here we will load the environment and create the application instance
| that serves as the central piece of this framework. We'll use this
| application as an "IoC" container and router for this framework.
|
 */

$app = new Laravel\Lumen\Application(
    realpath(__DIR__ . '/../')
);

// 开启Facades
$app->withFacades();

// 开启Eloquent
$app->withEloquent();

// config
$app->configure('app');
$app->configure('auth');
$app->configure('secrets');
$app->configure('filesystems');
$app->configure('custom');

/*
|--------------------------------------------------------------------------
| Register Container Bindings
|--------------------------------------------------------------------------
|
| Now we will register a few bindings in the service container. We will
| register the exception handler and the console kernel. You may add
| your own bindings here if you like or you can make another file.
|
 */

$app->singleton(
    Illuminate\Contracts\Debug\ExceptionHandler::class,
    App\Exceptions\Handler::class
);

$app->singleton(
    Illuminate\Contracts\Console\Kernel::class,
    App\Console\Kernel::class
);

/*
|--------------------------------------------------------------------------
| Register Middleware
|--------------------------------------------------------------------------
|
| Next, we will register the middleware with the application. These can
| be global middleware that run before and after each request into a
| route or middleware that'll be assigned to some specific routes.
|
 */

// $app->middleware([
//    App\Http\Middleware\ExampleMiddleware::class
// ]);

// 开启路由中间件
$app->routeMiddleware([
    'auth'              => App\Http\Middleware\Authenticate::class,
    'cors'              => palanik\lumen\Middleware\LumenCors::class,
    'verifydevicetoken' => App\Http\Middleware\VerifyDeviceToken::class,
]);

/*
|--------------------------------------------------------------------------
| Register Service Providers
|--------------------------------------------------------------------------
|
| Here we will register all of the application's service providers which
| are used to bind services into the container. Service providers are
| totally optional, so you are not required to uncomment this line.
|
 */

// 开启AppServiceProvider
$app->register(App\Providers\AppServiceProvider::class);
$app->register(App\Providers\AuthServiceProvider::class);
// $app->register(App\Providers\EventServiceProvider::class);

// 引入lumen-passport和laravel-passport
$app->register(Laravel\Passport\PassportServiceProvider::class);
$app->register(Dusterio\LumenPassport\PassportServiceProvider::class);

// 引入dingo
$app->register(Dingo\Api\Provider\LumenServiceProvider::class);
// 引入laravel-log-viewer
$app->register(\Rap2hpoutre\LaravelLogViewer\LaravelLogViewerServiceProvider::class);
// lumen每天的日志记录, 生成一个单独日志文件
$app->configureMonologUsing(function(Monolog\Logger $monolog) use ($app) {
    return $monolog->pushHandler(
        new \Monolog\Handler\RotatingFileHandler($app->storagePath().'/logs/lumen.log')
    );
});

/*
|--------------------------------------------------------------------------
| Register Class Aliases
|--------------------------------------------------------------------------
|
| Now we will register a few class aliases.
|
 */

class_alias(Illuminate\Support\Facades\Storage::class, 'Storage');
// class_alias(Silber\Bouncer\BouncerFacade::class, 'Bouncer');

/*
|--------------------------------------------------------------------------
| Load The Application Routes
|--------------------------------------------------------------------------
|
| Next we will include the routes file so that they can all be added to
| the application. This will provide all of the URLs the application
| can respond to, as well as the controllers that may handle them.
|
 */

$app->group(['namespace' => 'App\Http\Controllers'], function ($app) {
    require __DIR__ . '/../routes/web.php';
    require __DIR__ . '/../routes/api/v1.php';
});

// $app->group([
//     'namespace' => 'App\Http\Controllers',
// ], function ($app) {
//     require base_path('routes/web.php');
// });

// $app->group([
//     'middleware' => 'auth:api',
//     'namespace' => 'App\Http\Controllers',
//     'prefix' => 'api',
// ], function ($app) {
//     require base_path('routes/api.php');
// });
return $app;
